// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import com.x52im.rbchat.MyApplication;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.main.loginimpl.LoginInfoToSave;

/**
 * Preferences辅助类.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @since 2.5
 */
public class PreferencesToolkits
{
	private final static String TAG = PreferencesToolkits.class.getSimpleName();

	/** 存储用户最近登陆用户名的key标识常量（本Shared Preferences目前只在LoginActivity内有效果哦，
	 * 使用MODE_PRIVATE是为了只能被本APP访问（不然跟其它APP因key问题冲突了哦）） */
	public final static String SHARED_PREFERENCES_KEY_LOGIN$NAME = "__app_l_n__";

	/** 
	 * 存储常量的Shared Preferences标识常量（根据Android的Shared Preferences原理，如果不指名名字，则
	 * 用的是对应Activity的包名加类名作为名称，那么其它activity就很难取到罗）  */
	public final static String SHARED_PREFERENCES_SHAREDPREFERENCES = "__sharedpreferences__";
	/** 存储用户最近设置的全局APP“是否开启消息声音提醒”的key标识常量 */
	public final static String SHARED_PREFERENCES_KEY_APP_MSG_TONE = "__app_m_t__";
	/**  存储“是否开启指定聊天会话的消息声音提醒”的key标识常量(用于"消息免打扰"设置功能中) */
	public final static String SHARED_PREFERENCES_KEY_CHAT$MSG_TONE = "__g_m_t__";
	/** 存储“是否显示群成员昵称”的key标识常量 */
	public final static String SHARED_PREFERENCES_KEY_GROUP$IS_SHOW_NICK = "__g_i_s_n__";
	/** 存储“最近一次查看的好友请求列表中，已读的最新一条请求的时间戳”的key标识常量 */
	public final static String SHARED_PREFERENCES_KEY_HAS_READ_LATEST_FRIEND_REQ_TIMESTAMP = "__l_f_r_t__";
	
	public static SharedPreferences getAppDefaultSharedPreferences(Context context, boolean canWrite)
	{
		return context.getSharedPreferences(
				SHARED_PREFERENCES_SHAREDPREFERENCES
//              , canWrite?Context.MODE_WORLD_WRITEABLE:Context.MODE_WORLD_READABLE
                , Context.MODE_PRIVATE // 20180612：因android 7.0上已不建议或有些厂商已不支持MODE_WORLD_READABLE这种，所以用MODE_PRIVATE替代
        );
	}

    /**
     * 用户最近设置的APP全局“是否开启消息提醒”开关值。
     * 注意：本开关是全局开关，一旦关闭，单独的群聊、世界频道、好友消息等的提醒都会无条件被关闭。
     *
     * @return YES表示已开启，否则表示已关闭
     */
	public static boolean isAPPMsgToneOpen(Context context)
	{
		return is(context, SHARED_PREFERENCES_KEY_APP_MSG_TONE, true);
	}

    /**
     * 设置的APP全局“是否开启消息提醒”开关值。
     * 注意：本开关是全局开关，一旦关闭，单独的群聊、世界频道、好友消息等的提醒都会无条件被关闭。
     */
	public static void setAPPMsgToneOpen(Context activity, boolean msgToneOpen)
	{
		set(activity, SHARED_PREFERENCES_KEY_APP_MSG_TONE, msgToneOpen);
	}
	
	/**
	 * 是否指定聊天会话的消息提示音打开（区别是全局消息提醒，这个是指具体到某人、某群的聊天消息提醒）.
	 *
	 * @param context 上下文
	 * @param chatId 聊天id，对应用于首页"消息"列表中的dataId，即当聊天类型是单聊时表示对方的uid、群聊时是gid
	 * @return true表示开启提醒（也就是关闭"消息勿扰）"，否则表示关闭（也就是打开"消息勿扰"）
	 */
	public static boolean isChatMsgToneOpen(Context context, String chatId)
	{
		return is(context, SHARED_PREFERENCES_KEY_CHAT$MSG_TONE +chatId, true);
	}
	/**
	 * 设置指定聊天会话的消息消息提示音开关量（区别是全局消息提醒，这个是指具体到某人、某群的聊天消息提醒）.
	 *
	 * @param activity 上下文
	 * @param msgToneOpen true表示开启提醒（也就是关闭"消息勿扰）"，否则表示关闭（也就是打开"消息勿扰"）
	 * @param chatId 聊天id，对应用于首页"消息"列表中的dataId，即当聊天类型是单聊时表示对方的uid、群聊时是gid
	 */
	public static void setChatMsgToneOpen(Context activity, boolean msgToneOpen, String chatId)
	{
		set(activity, SHARED_PREFERENCES_KEY_CHAT$MSG_TONE +chatId, msgToneOpen);
	}

	/**
	 * 是否群聊里显示昵称.
	 *
	 * @param context
	 * @return true表示打开群组消息提示（包括声音），否则关闭（不提示，但不影响数据处理）
	 */
	public static boolean isGroupShowNick(Context context, String gid)
	{
		return is(context, SHARED_PREFERENCES_KEY_GROUP$IS_SHOW_NICK+gid, true);
	}
	/**
	 * 设置是否群聊里显示昵称开关量.
	 *
	 * @param context 上下文
	 * @param showNick true表示显示，否则不显示
	 */
	public static void setGroupShowNick(Context context,boolean showNick, String gid)
	{
		set(context, SHARED_PREFERENCES_KEY_GROUP$IS_SHOW_NICK+gid, showNick);
		Log.d(TAG, "............. 正在设置 "+(SHARED_PREFERENCES_KEY_GROUP$IS_SHOW_NICK+gid)+"的值："+showNick);
	}

	/**
	 * 获取“最近一次查看的好友请求列表中，已读的最新一条请求的时间戳”.
	 *
	 * @param context 上下文
	 * @return true表示打开群组消息提示（包括声音），否则关闭（不提示，但不影响数据处理）
	 */
	public static long getHasReadLatestFriendReqTimestamp(Context context)
	{
		return get(context, SHARED_PREFERENCES_KEY_HAS_READ_LATEST_FRIEND_REQ_TIMESTAMP, 0L);
	}
	/**
	 * 设置“最近一次查看的好友请求列表中，已读的最新一条请求的时间戳”.
	 *
	 * @param context 上下文
	 * @param tm 时间戳
	 */
	public static void setHasReadLatestFriendReqTimestamp(Context context, long tm)
	{
		set(context, SHARED_PREFERENCES_KEY_HAS_READ_LATEST_FRIEND_REQ_TIMESTAMP, tm);
		Log.d(TAG, "............. 正在设置 "+(SHARED_PREFERENCES_KEY_HAS_READ_LATEST_FRIEND_REQ_TIMESTAMP)+"的值："+tm);
	}

	/**
	 * 通用开关量获取方法
	 *
	 * @param key 要获取的key
	 * @return true or false
	 */
	public static boolean is(Context context, String key, boolean defaultValue)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, false);
		return nameSetting.getBoolean(getLocalUserUid()+key, defaultValue);
	}

	/**
	 * 通用String值获取方法。
	 *
	 * @param @param key 要获取的key
	 * @return 字符串
	 */
	public static String get(Context context, String key, String defaultValue)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, false);
		return nameSetting.getString(getLocalUserUid()+key, defaultValue);
	}

	/**
	 * 通用Long值获取方法。
	 *
	 * @param @param key 要获取的key
	 * @return long整数
	 */
	public static long get(Context context, String key, long defaultValue)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, false);
		return nameSetting.getLong(getLocalUserUid()+key, defaultValue);
	}

	/**
	 * 通用开关量设置方法.
	 *
	 * @param key 要设置的key
	 * @param is true or false
	 */
	public static void set(Context activity, String key, boolean is)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(activity, true);
		SharedPreferences.Editor namePref = nameSetting.edit();
		namePref.putBoolean(getLocalUserUid()+key, is);
		namePref.commit();
	}

	/**
	 * 通用String值设置方法。
	 *
	 * @param key 要设置的key
	 * @param v value
	 */
	public static void set(Context activity, String key, String v)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(activity, true);
		SharedPreferences.Editor namePref = nameSetting.edit();
		namePref.putString(getLocalUserUid()+key, v);
		namePref.commit();
	}

	/**
	 * 通用Long值设置方法。
	 *
	 * @param key 要设置的key
	 * @param v value
	 */
	public static void set(Context activity, String key, long v)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(activity, true);
		SharedPreferences.Editor namePref = nameSetting.edit();
		namePref.putLong(getLocalUserUid()+key, v);
		namePref.commit();
	}

	public static void remove(Context context, String key)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, true);
		SharedPreferences.Editor namePref = nameSetting.edit();
		namePref.remove(getLocalUserUid()+key);
		namePref.commit();
	}

	private static String getLocalUserUid()
	{
		RosterElementEntity localUserInfo = MyApplication.getInstance2().getIMClientManager().getLocalUserInfo();
		if(localUserInfo != null)
			return localUserInfo.getUser_uid();
		return "";
	}

	//----------------------------------------------------------------------- for auto login START
	/**
	 * <p>
	 * 返回最近陆的用户名.
	 * 它是使用SharedPreferences机制进行存放的.
	 * </p>
	 *
	 * @return
	 * @see SharedPreferences#getString(String, String)
	 */
	public static LoginInfoToSave getDefaultLoginName(Context context)
	{
		//取出最近登陆过的用户名
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, true);
		String json = nameSetting.getString(PreferencesToolkits.SHARED_PREFERENCES_KEY_LOGIN$NAME,null);
		return json == null?null: LoginInfoToSave.fromJSON(json);
	}

	/**
	 * 设置"自动登陆"开关量。
	 *
	 * @param context
	 * @param autoLogin true表示允许自动登陆，否由不允许
	 */
	public static void setAutoLogin(Context context, boolean autoLogin)
	{
		try{
			LoginInfoToSave li = getDefaultLoginName(context);
			if(li != null)
				li.setAutoLogin(autoLogin);

			// 重新保存
			saveDefaultLoginName(context, li);
		}
		catch(Exception e){
			Log.w(TAG, e);
		}
	}

	/**
	 * 调用本方法实现对用户名的保存(以备下次登陆时无需再次输入).
	 *
	 * @param li
	 * @see SharedPreferences.Editor#putString(String, String)
	 */
	public static void saveDefaultLoginName(Context context, LoginInfoToSave li)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, true);
		SharedPreferences.Editor namePref=nameSetting.edit();
		namePref.putString(PreferencesToolkits.SHARED_PREFERENCES_KEY_LOGIN$NAME
				, li==null?null:LoginInfoToSave.toJSON(li));
		namePref.commit();
	}

	/**
	 * 调用本方法实现删除之前保存过的最近登陆用户名.
	 *
	 * @see SharedPreferences.Editor#remove(String)
	 */
	public static void removeDefaultLoginName(Context context)
	{
		SharedPreferences nameSetting = getAppDefaultSharedPreferences(context, true);
		SharedPreferences.Editor namePref = nameSetting.edit();
		namePref.remove(PreferencesToolkits.SHARED_PREFERENCES_KEY_LOGIN$NAME);
		namePref.commit();
	}
	//----------------------------------------------------------------------- for auto login END
}
